package com.example.sync.handler.impl;

import cn.hutool.core.lang.Assert;
import com.example.sync.constant.Constant;
import com.example.sync.handler.IHandler;
import com.example.sync.po.SysASyncJob;
import com.example.sync.service.SysASyncJobService;
import com.example.utils.SerializableUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;

/**
 * @author chentao
 * @version 1.0
 * @description: TODO
 * @date 2025/3/22 下午3:33
 */
public abstract class SysAbstractHandler implements IHandler {

    Logger logger = LoggerFactory.getLogger(getClass());

    @Resource
    private SysASyncJobService sysASyncJobService;

    @Value("${sync.max.retry-period:60}")
    private int retryPeriod;

    @Override
    public boolean isMatch(SysASyncJob sysASyncJob) {
        return sysASyncJob.getType().equalsIgnoreCase(this.getType());
    }

    @Override
    public int getRetryPeriod() {
        return this.retryPeriod;
    }

    @Override
    public void success(SysASyncJob sysASyncJob) {
        logger.debug("异步任务执行成功: {}", sysASyncJob);
    }

    @Override
    public void failure(SysASyncJob sysASyncJob) {
        logger.warn("异步任务执行失败: {}", sysASyncJob);
    }

    /***
     * 不指定节点发布任务
     * @param modelName
     * @param modelId
     * @param modelKey
     * @param targetModel
     * @param targetContext
     * @return
     * @throws Exception
     */
    @Override
    public Long publish(String modelName, Long modelId, String modelKey, String targetModel, Object targetContext) throws Exception {
        return publish(modelName, modelId, modelKey, targetModel, targetContext, null);
    }

    /***
     * 指定节点处理异步任务
     * @param modelName
     * @param modelId
     * @param modelKey
     * @param targetModel
     * @param targetContext
     * @param serverId
     * @return
     * @throws Exception
     */
    @Override
    public Long publish(String modelName, Long modelId, String modelKey, String targetModel, Object targetContext, Long serverId) throws Exception {
        Assert.isTrue(targetContext != null && StringUtils.hasText(targetModel), "targetContext、targetModel 参数不可以为空.");
        SysASyncJob sysASyncJob = new SysASyncJob();
        sysASyncJob.setType(getType());
        sysASyncJob.setTargetModel(targetModel);
        sysASyncJob.setTargetContent(SerializableUtils.serializeToString(targetContext));
        sysASyncJob.setModelName(modelName);
        sysASyncJob.setModelKey(modelKey);
        sysASyncJob.setModelId(modelId);
        sysASyncJob.setStatus(Constant.RUNNING);
        sysASyncJob.setServerId(serverId);
        sysASyncJob.recalculateFields();
        this.sysASyncJobService.save(sysASyncJob);
        return sysASyncJob.getId();
    }
}
